import parseAttrString from "./parseAttrString";
export default function (templateString) {
    // 指针
    var index = 0;
    // 剩余部分
    var rest = '';
    // 开始标记
    var startRegExp = /^\<([a-z]+[1-6]?)(\s[^\<]+)?\>/;
    // 结束标记
    var endRegExp = /^\<\/([a-z]+[1-6]?)/;
    // 准备两个栈；
    var stack1 = [];
    var stack2 = [{children: []}];
    // 抓取结束标记前的文字
    var wordRepExp = /^([^\<]+)\<\/[a-z]+[1-6]/
    while (index < templateString.length - 1) {
        rest = templateString.substring(index)
        // console.log(templateString[index])
        // 识别遍历到的这个字符，是不是一个开始标签
        if (startRegExp.test(rest)) {
            let tag = rest.match(startRegExp)[1];
            let attrsString = rest.match(startRegExp)[2];
            // console.log('检测到开始标记:', tag)
            // 将开始标记推入栈中
            stack1.push(tag)
            stack2.push({children: [], tag: tag, attrs: parseAttrString(attrsString)})
            // 指针移动标签的长度加2再加attrsString的长度，因为<>占两位
            const attrLen = attrsString ? attrsString.length : 0;
            index += tag.length + 2 + attrLen;
        } else if (endRegExp.test(rest)) {
            //  识别遍历到的字符，是不是结束标签
            // 指针移动标签的长度加3，因为</>占三位
            let tag = rest.match(endRegExp)[1];
            // 此时tag一定是和stack1栈顶元素相同的
            let pop_tag = stack1.pop();
            if (tag == pop_tag) {
                let pop_arr = stack2.pop();
                if (stack2.length) {
                    // 检查stack2[stack2.length - 1]是否有children属性，如果没有就创建一个数组
                    stack2[stack2.length - 1].children.push(pop_arr)
                }
            } else {
                throw new Error(stack1[stack1.length - 1] + '标签没有封闭')
            }
            // console.log('检测到结束标记:', tag)
            index += tag.length + 3;
            // console.log(stack1, JSON.stringify(stack2))
        } else if (wordRepExp.test(rest)) {
            // 识别遍历到的这个字符，是不是文字，并且不是全空
            let word = rest.match(wordRepExp)[1];
            // 看word是不是全是空
            if (!/^\s+$/.test(rest)) {
                // 不是空
                // console.log('检测到文字-', word)
                // 改变此时sctack2栈顶元素
                stack2[stack2.length - 1].children.push({
                    'text': word,
                    'type': 3
                })
            }

            // 指针移动标签的长度加字符长度
            index += word.length;
        } else {
            // 标签中的文字
            index++;
        }
    }
    // console.log(stack2)
    // 此时stack2就是我们之前默认放置的一项了，此时要返回这一项的children即可
    return stack2[0].children[0];
}